---
sidebar_position: 2
---

# Задачи

## Шаблон

Даны три случая:

- 1-й случай, когда даны две строки, выведите наименьшую из двух строк.
- 2-й случай, когда даны два целых числа, выведите наименьшее из двух целых чисел.
- 3-й случай, когда даны два символа, выведите наименьший из двух символов (в нижнем регистре).

Ваша задача - создать класс `minElement`, который будет включать приватную переменную `y`, конструктор, который будет устанавливать заданное значение в приватную переменную. И метод `check()`, который будет принимать один параметр, скажем `x`, и выводить `min` из `x` и `y` (приватная переменная).

Первая строка каждого ввода будет содержать:

- одно целое число `c`.

Следующая строка будет содержат:

- две строки, если `c` равно `1`
- два целых числа, если `c` равно `2`
- два `char`, если значение `c` равно `3`.

Мы должны вывести наименьшее из двух заданных значений

### Пример 1

```bash
Input:
1
gfg spl
Output: 
gfg
```

### Пример 2

```bash
Input:
2
5 9
Output: 
5
```

### Прототип

```cpp
#include <bits/stdc++.h>
using namespace std;

template <class T>
class minElement {
  // Завершите создание класса. Создайте приватную переменную, конструкторы и
  // метод под названием check(), который принимает один параметр и печатает
  // вывод в новой строке.
};

int main() {
  int t;
  cin >> t;
  while (t--) {
    int c;
    cin >> c;
    if (c == 1) {
      string a, b;
      cin >> a >> b;
      minElement<string> obj1(a);
      obj1.check(b);
    } else if (c == 2) {
      int a, b;
      cin >> a >> b;
      minElement<int> obj2(a);
      obj2.check(b);
    } else {
      char a, b;
      cin >> a >> b;
      minElement<char> obj3(a);
      obj3.check(b);
    }
  }
}

```

## Специализация шаблонов классов

Дано описание функции `main`, которая считывает значения перечисления для двух разных типов в качестве входных данных, затем выводит соответствующие имена перечисления. Напишите **шаблон класса**, который может предоставлять имена значений перечисления **для обоих типов**. Если значение перечисления недопустимо, то выведите `unknown`.

### Формат ввода

Первая строка содержит $t$ количество тестовых примеров.

Каждая из $t$ последующих строк содержит два целых числа через пробел. Первое целое число - это значение цвета $c$, а второе целое число - это значение фрукта $f$.

### Ограничения

- $1 \le t \le 100$
- $-2 \times 10^9 \le c \le 2 \times 10^9$
- $-2 \times 10^9 \le f \le 2 \times 10^9$

### Формат вывода

Код прототипа печатает $t$ строк, содержащие название цвета и название фрукта, соответствующие входному индексу перечисления.

### Пример ввода

```bash
2
1 0
3 3
```

### Пример вывода

```bash
green apple
unknown unknown
```

### Объяснение

Начиная с $t=2$, выводятся две строки.

1. Два входных значения индекса `1` и `0`, соответствуют `green` в перечислении `Color` и `apple` в перечислении `Fruit`. Таким образом, мы выводим `green apple`.
2. Два входных значения, $3$ и $3$, находятся за пределами диапазона наших перечислений. Таким образом, мы выводим `unknown unknown`.

### Прототип

```cpp
#include <iostream>
using namespace std;
enum class Color { red, green, orange };
enum class Fruit { apple, orange, pear };

template <typename T>
class Traits;

// Определите специализации для шаблона класса Traits здесь.

int main() {
  int t = 0;
  std::cin >> t;
  for (int i = 0; i != t; ++i) {
    int index1;
    std::cin >> index1;
    int index2;
    std::cin >> index2;
    cout << Traits<Color>::name(index1) << " ";
    cout << Traits<Fruit>::name(index2) << "\n";
  }
}

```
